#define _CRT_SECURE_NO_WARNINGS 1

#include "openHash.hpp"
#include "unordered_set.hpp"
#include "unordered_map.hpp"
//#include "Close_Hash.h"
#include <iostream>
using namespace OpenHash;

//void test1()
//{
//	HashBucket<std::string, std::string> hash;
//	//hash.Insert("asd");
//	//hash.Insert(2);
//	//hash.Insert(1);
//	//hash.Insert(3);
//	//hash.Insert(2);
//	//hash.Insert(1);
//	//hash.Insert(9);
//	//hash.Insert(17);
//	std::cout << hash.BucketCount() << std::endl;
//	std::cout << hash.Size() << std::endl;
//	for (auto& e : hash)
//	{
//		std::cout << e << " ";
//	}
//	//std::cout << hash.Find(5) << std::endl;
//	//std::cout << hash.Find(20) << std::endl;
//}


void test2()
{
	//wzh::unordered_set<int> set;
	//set.insert(5);
	//set.insert(3);
	//set.insert(5);
	//set.insert(6);
	//set.insert(8);
	//set.insert(0);
	//set.insert(5);
	//set.find(0);
	//set.erase(8);
	//wzh::unordered_set<std::string> set;
	//set.insert("dsds");
	//set.insert("dsfc");
	//set.insert("fdfg");
	//set.insert("dhhj");
	//for (auto& e : set)
	//{
	//	std::cout << e << ' ';
	//}
	////wzh::unordered_set<std::string> set1(set);

	//std::cout << std::endl;
	//std::cout << set.size() << " " << set.count() << std::endl;
}

void test3()
{
	wzh::unordered_map<string, string> map;
	map.insert({ "t", "a"});
	map.insert({ "p", "b"});
	map.insert({ "o", "c"});
	map.insert({ "O", "b"});
	for (auto& e : map)
	{
		cout << e.first << " " << e.second << endl;
	}
	//map.erase(1);
	//std::cout << map.size() << ' ' << map.count() << std::endl;
	//std::cout << map.find(3)->first << " " << map.find(3)->second << std::endl;
}

//using namespace Close_Hash;
//void test4()
//{
//	HashTable<int, string> cht;
//	cht.Insert({ 5, "a" });
//	cht.Insert({ 8, "b"});
//	cht.Insert({ 7, "c"});
//	cht.Insert({ 11, "g" });
//	cht.Insert({ 0, "g"});
//	//cht.Insert({ 6, 0 });
//	//cht.Insert({12, 0});
//	//cout << cht.Find(1) << endl;
//	cht.Erase(5);
//	//cout << cht.Find(1) << endl;
//	cout << cht.Empty() << cht.Size() << endl;
//
//}

#include <unordered_set>

class Date
{
public:
	Date(){}
	Date(int year, int month, int day)
		:_year(year), _month(month), _day(day)
	{}
	int _year = 0;
	int _month = 0;
	int _day = 0;
};
void test5()
{
	//std::unordered_set<Date> date;
	//set.insert(Date(2012, 4, 5));
	//set.insert(Date(2013, 4, 5));
	//set.insert(Date(2014, 4, 5));
}

int main()
{

	test3();
	//HashBucket<int, int> hash;
	//hash.Insert(5);
	//hash.Insert(4);
	//hash.Insert(3);
	//hash.Insert(2);
	//hash.Insert(1);
	//hash.Insert(9);
	//hash.Insert(17);
	//std::cout << hash.BucketCount() << std::endl;
	//std::cout << hash.Size() << std::endl;
	//std::cout << hash.Find(5) << std::endl;
	//std::cout << hash.Find(20) << std::endl;
	////hash.Clear();

	////std::cout << hash.Erase(4) << std::endl;
	////std::cout << hash.Erase(17) << std::endl;
	////std::cout << hash.Erase(9) << std::endl;
	////std::cout << hash.Erase(1) << std::endl;
	////std::cout << hash.Erase(3) << std::endl;
	////std::cout << hash.Erase(5) << std::endl;
	////std::cout << hash.Erase(2) << std::endl;


	////HashBucket<std::string, int> hash;
	////hash.Insert(1);
	////hash.Insert("rt", 3);
	////hash.Insert("check", 4);
	////hash.Insert("ingh", 6);

	//for (auto& e : hash)
	//{
	//	std::cout << e << " ";
	//}
	//std::cout << std::endl;
	////std::cout << hash.Find("rt") << " " << hash.Empty() << " " << hash.Size() << " " << hash.BucketCount() << std::endl;
	//hash.Clear();

	return 0;
}